package com.hippo.liteflow.component.nodeComponent;

import com.hippo.liteflow.entity.AEntity;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.extern.slf4j.Slf4j;

/**
 * @ClassName ACmp
 * @Description TODO 组件A
 * @Author tangxl
 * @create 2023-03-30 16:36
 **/
@LiteflowComponent("a")
@Slf4j
public class ACmp extends NodeComponent {
    /**
     * 业务逻辑处理
     * @throws Exception
     */
    @Override
    public void process() throws Exception {
        log.info("我是{}，我执行业务了", this.getClass().getSimpleName());
        log.info("A获取组件ID：{}", this.getNodeId());
        log.info("A获取组件别名：{}",this.getName());
        log.info("A获取当前流程名称：{}",this.getChainName());
        log.info("A获取流程的初始化参数：{}",this.getRequestData().toString());
        log.info("A获取到String参数：{}",this.getContextBean(String.class));
        log.info("A获取到AEntity参数：{}",this.getContextBean(AEntity.class).toString());
        log.info("A-->getTag:{}" , getTag());
        // 设置流程是否继续执行
        this.setIsEnd(false);
        // 主流程和隐式子流程共同享有同一个上下文的数据。所以隐式子流程里也完全可以拿到这个请求中的所有数据。
        for(int i=0;i<2;i++){
            // 调用隐式组件
//            this.invoke("strategy1","隐式流程的初始参数，可为null");
            // 单开线程去调用隐式组件
            this.invokeInAsync("strategy1","隐式流程的初始参数，可为null");
            // 调用隐式组件，并且获取返回值
//            this.invoke2Resp("strategy1","隐式流程的初始参数，可为null");
//            this.invoke2RespInAsync("strategy1","隐式流程的初始参数，可为null");
        }
        log.info("A-->isContinueOnError:{}" , isContinueOnError());
    }

    /**
     * 业务逻辑处理成功后的回调
     * @throws Exception
     */
    @Override
    public void onSuccess() throws Exception {
        log.warn("-------A执行成功----------");
    }

    /**
     * 业务逻辑处理失败后的回调
     * @throws Exception
     */
    @Override
    public void onError() throws Exception {
        log.warn("--------A执行失败---------");
        // onError方法本身抛错，那么最终抛到最外面的错，是主方法里的错
        throw new Exception("A执行失败");
    }
}
